package thread;

import io.netty.bootstrap.Bootstrap;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioSocketChannel;
import java.io.BufferedReader;
import java.io.InputStreamReader;

public final class NettyClient extends Thread{

	private static final String HOST = "127.0.0.1";
	private static final int PORT = 8992;
	
    @Override
	public void run() {
    	try {
            EventLoopGroup group = new NioEventLoopGroup();
            try {
                Bootstrap b = new Bootstrap();
                b.group(group)
                 .channel(NioSocketChannel.class)
                 .handler(new MyClientChannelInitializer());

                // Start the connection attempt.
                Channel ch = b.connect(HOST, PORT).sync().channel();

                // Read commands from the stdin.
                ChannelFuture lastWriteFuture = null;
                BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
                for (;;) {
                    String line = in.readLine();
                    if (line == null) {
                        break;
                    }

                    // Sends the received line to the server.
                    lastWriteFuture = ch.writeAndFlush(line + "\r\n");

                    // If user typed the 'bye' command, wait until the server closes
                    // the connection.
                    if ("bye".equals(line.toLowerCase())) {
                        ch.closeFuture().sync();
                        break;
                    }
                }

                // Wait until all messages are flushed before closing the channel.
                if (lastWriteFuture != null) {
                    lastWriteFuture.sync();
                }
            } finally {
                // The connection is closed automatically on shutdown.
                group.shutdownGracefully();
            }
    		
		} catch (Exception e) {
		}
    	
	}

}
